﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Xml.Linq;
using SeoulOpenApi;

namespace API_SampleBook_Silverlight
{
	public partial class MainPage : UserControl
	{
		public MainPage()
		{
			InitializeComponent();
		}

		private void UserControl_Loaded(object sender, RoutedEventArgs e)
		{
			loadData();
		}

		private void loadData()
		{
			var services = new List<ApiService>();
			var xElement = XElement.Load("ServiceData.xml");
			foreach (var element in xElement.Elements("Service"))
			{
				var api = new ApiService()
								{
									Description = element.Attribute("Description").Value,
									Name = element.Attribute("Name").Value,
									Items = new List<ApiServiceItem>()
								};
				foreach (var item in element.Elements("Item"))
				{
					api.Items.Add(new ApiServiceItem()
									{
										Name = item.Attribute("Name").Value,
										Description = item.Attribute("Description").Value,
										Required = int.Parse(item.Attribute("Required").Value),
										Optional = int.Parse(item.Attribute("Optional").Value),
										Parent = api
									});
				}

				services.Add(api);
			}
			treeServiceItem.ItemsSource = services;
		}

		private void buttonResult_Click(object sender, RoutedEventArgs e)
		{
			// 1. Validation
			var n = textBoxName.Text;
			var k = textBoxKey.Text;
			if (String.IsNullOrEmpty(n) && String.IsNullOrEmpty(k))
			{
				MessageBox.Show("ID 및 Key를 입력해주세요!" + Environment.NewLine + "발급은 http://mobile.openapi.seoul.go.kr/ 를 참고하세요.", "에러", MessageBoxButton.OK);
				return;
			}

			var selectedServiceItem = treeServiceItem.SelectedItem as ApiServiceItem; // 선택 서비스 지정.
			if (selectedServiceItem == null) return;

			// argument 처리.
			var input = new string[] { };
			if (selectedServiceItem.Required + selectedServiceItem.Optional > 0)
			{
				input = String.IsNullOrWhiteSpace(textBoxInput.Text) ? new string[] { } : textBoxInput.Text.Split(Convert.ToChar('\r'));
				if (input.Length < selectedServiceItem.Required ||
					input.Length > selectedServiceItem.Required + selectedServiceItem.Optional)
				{
					MessageBox.Show(String.Format("변수의 갯수가 맞지않습니다.{2}필요한 변수는 {0}개의 필수입력과 {1}개의 선택입력을 가지고 있습니다.{2}현재 입력: {3}개", selectedServiceItem.Required, selectedServiceItem.Optional, Environment.NewLine, input.Length), "에러", MessageBoxButton.OK);
					return;
				}
			}

			// 2. 선택된 서비스 지정
			BaseService apiService = null; // 기존 연결 정리
			switch (selectedServiceItem.Parent.Name)
			{
				case "Air":
					apiService = new SeoulOpenApi.Air.AirService(n, k);
					break;

                case "Subway":
                    apiService = new SeoulOpenApi.Subway.SubwayArrivalService(n, k);
                    break;

				default:
					break;
			}

			if (apiService == null)
			{
				MessageBox.Show("해당하는 서비스가 없습니다.", "에러", MessageBoxButton.OK);
				return;
			}


			// 통신 완료시 이벤트 처리.
			apiService.OnDownloadCompleted += (success, result) =>
												{
													if (success)
														textBoxOutput.Text = result.ToString();
													else
														MessageBox.Show("통신에 문제가 있습니다.", "에러", MessageBoxButton.OK);
												};
			// 쿼리 실행.
			try
			{
				apiService.Request(selectedServiceItem.Name, input);
			}
			catch (Exception exception)
			{
				MessageBox.Show(exception.Message, "에러", MessageBoxButton.OK);
			}
		}

		private void treeServiceItem_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
		{
			if (e.NewValue is ApiService)
			{
				infoTextBlock.Text = "하부 서비스를 선택해주세요.";
			}
			else if (e.NewValue is ApiServiceItem)
			{
				var item = e.NewValue as ApiServiceItem;
				infoTextBlock.Text = String.Format("선택된 {2} 서비스는 {0}개의 필수인자, {1}개의 필수인자를 필요로 합니다.", item.Required, item.Optional, item.Description);
			}
		}
	}

	public class ApiService
	{
		public string Name { get; set; }
		public string Description { get; set; }
		public List<ApiServiceItem> Items { get; set; }
	}

	public class ApiServiceItem
	{
		public string Name { get; set; }
		public string Description { get; set; }
		public int Required { get; set; }
		public int Optional { get; set; }
		public virtual ApiService Parent { get; set; }
	}
}
